# 导入必要的库
import pandas as pd  # 用于数据处理和分析
import matplotlib.pyplot as plt  # 用于数据可视化
import numpy as np  # 用于数值计算和随机数生成

# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体显示中文标签
plt.rcParams['axes.unicode_minus'] = False   # 解决负号显示为方框的问题
file_path_clear='../../data/cleared data/'
file_path_image='../../data/image/'
# 读取菜品信息数据文件
dish_df = pd.read_excel(file_path_clear+"餐饮连锁品牌数据_菜品信息4_cleaned.xlsx")

# 模拟销量数据：基于价格生成模拟销量
np.random.seed(42)  # 设置随机种子，保证每次运行结果一致
# 销量计算公式：基础销量800 - 价格影响 + 随机噪声
dish_df['销量'] = 800 - (dish_df['售价(元)'] * 6) + np.random.normal(0, 80, len(dish_df))
dish_df['销量'] = dish_df['销量'].clip(lower=30)  # 确保销量不低于30份

# 计算30-50元价格区间的销量占比
total_sales = dish_df['销量'].sum()  # 计算总销量
# 筛选30-50元区间的菜品，计算其总销量
target_sales = dish_df[(dish_df['售价(元)'] >= 30) & (dish_df['售价(元)'] <= 50)]['销量'].sum()
target_percent = (target_sales / total_sales) * 100  # 计算占比百分比

# 创建散点图分析售价与销量的关系
plt.figure(figsize=(12, 8))  # 设置图形大小

# 根据价格区间设置不同的颜色标识
colors = []  # 初始化颜色列表
for price in dish_df['售价(元)']:
    if price < 30:
        colors.append('green')   # 低价区间：绿色
    elif price <= 50:
        colors.append('blue')    # 目标区间：蓝色
    else:
        colors.append('red')     # 高价区间：红色

# 使用分开参数写法绘制散点图
plt.scatter(dish_df['售价(元)'], dish_df['销量'],  # x轴：售价，y轴：销量
            c=colors,           # 点颜色（根据价格区间）
            alpha=0.7,          # 点透明度
            s=50)               # 点大小

# 为每个数据点标注菜品名称
for i, row in dish_df.iterrows():  # 遍历每一行数据
    plt.annotate(row['菜品名称'],     # 标注文本：菜品名称
                (row['售价(元)'], row['销量']),  # 标注位置：售价和销量坐标
                xytext=(5, 5),      # 文本偏移量
                textcoords='offset points',  # 偏移坐标单位
                fontsize=6)         # 字体大小

# 添加价格区间参考线
plt.axvline(x=30,           # 在x=30处画垂直线
            color='red',     # 线条颜色：红色
            linestyle='--',  # 线条样式：虚线
            alpha=0.5)       # 线条透明度

plt.axvline(x=50,           # 在x=50处画垂直线
            color='red',     # 线条颜色：红色
            linestyle='--',  # 线条样式：虚线
            alpha=0.5)       # 线条透明度

# 设置图表基本属性
plt.title('菜品售价 vs 销量分析', fontsize=14)  # 图表标题
plt.xlabel('售价 (元)', fontsize=12)           # x轴标签
plt.ylabel('销量 (份)', fontsize=12)           # y轴标签
plt.grid(True, alpha=0.3)                     # 显示网格线，设置透明度
# 保存图片
plt.savefig(file_path_image+'散点图.png', dpi=150, bbox_inches='tight')# 保存图片
# 自动调整布局并显示图表
plt.tight_layout()  # 防止标签被截断
plt.show()          # 显示图表

# 输出分析结果到控制台
print(f"30-50元区间销量占比: {target_percent:.1f}%")  # 显示实际占比
print(f"目标占比: 60.0%")                            # 显示目标占比
print(f"差距: {60 - target_percent:.1f}个百分点")     # 显示与目标的差距